package com.demo.aspect;

import com.demo.annotations.Priv;
import com.demo.controller.UserController;
import com.demo.enums.Role;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * 符合切入点表达式的连接点的方法并且要求方法上面有@Priv类型的注解
 * @author gy
 * @date 2022/6/15
 */
@Component
@Aspect
public class PrivAspect02 {

    private static final Logger logger = LoggerFactory.getLogger(PrivAspect02.class);

    @Pointcut("execution(* com.demo.service..*.*(..))")
    private void pri(){

    }
    // 方法二：
    //符合切入点表达式的连接点的方法并且要求方法上面有@Priv类型的注解
    @Around("pri()&&@annotation(p)")
    public Object around(ProceedingJoinPoint pjp, Priv p) throws Throwable {
        //进了环绕通知表明是符号要求的切入点的方法并且此方法的上面有@Priv类型的注解
        //获取用户角色
        Role role = UserController.role;
        //获取方法需要的角色
        Role[] roles = p.value();
        //检查是否匹配
        //把数组转成List集合，调用集合中contains来判断集合中是否有包含指定内容
        if (Arrays.asList(roles).contains(role)) {
            //匹配执行目标方法
            return pjp.proceed();
        } else {
            logger.info("用户权限存在问题~~~~~~~");
            //不匹配就抛出异常
            throw new RuntimeException("权限不足，无法访问！！！");
        }
    }

}
